//小红和小明在玩一个字符串元音游戏。 
//
// 给你一个字符串 s，小红和小明将轮流参与游戏，小红 先 开始： 
//
// 
// 在小红的回合，她必须移除 s 中包含 奇数 个元音的任意 非空 子字符串。 
// 在小明的回合，他必须移除 s 中包含 偶数 个元音的任意 非空 子字符串。 
// 
//
// 第一个无法在其回合内进行移除操作的玩家输掉游戏。假设小红和小明都采取 最优策略 。 
//
// 如果小红赢得游戏，返回 true，否则返回 false。 
//
// 英文元音字母包括：a, e, i, o, 和 u。 
//
// 
//
// 示例 1： 
//
// 
// 输入： s = "leetcoder" 
// 
//
// 输出： true 
//
// 解释： 小红可以执行如下移除操作来赢得游戏： 
//
// 
// 小红先手，她可以移除加下划线的子字符串 s = "leetcoder"，其中包含 3 个元音。结果字符串为 s = "der"。 
// 小明接着，他可以移除加下划线的子字符串 s = "der"，其中包含 0 个元音。结果字符串为 s = "er"。 
// 小红再次操作，她可以移除整个字符串 s = "er"，其中包含 1 个元音。 
// 又轮到小明，由于字符串为空，无法执行移除操作，因此小红赢得游戏。 
// 
//
// 示例 2： 
//
// 
// 输入： s = "bbcd" 
// 
//
// 输出： false 
//
// 解释： 小红在她的第一回合无法执行移除操作，因此小红输掉了游戏。 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 10⁵ 
// s 仅由小写英文字母组成。 
// 
//
// Related Topics 脑筋急转弯 数学 字符串 博弈 👍 13 👎 0


package LeetCode.editor.cn;


import java.util.Set;

/**
 * @author ldltd
 * @date 2025-09-12 19:00:23
 * @description 3227.字符串元音游戏
 
 */
 
public class VowelsGameInAString {
    public static void main(String[] args) {
    //测试代码
    VowelsGameInAString fun = new VowelsGameInAString();
    Solution solution= fun.new Solution();
        System.out.println(solution.doesAliceWin("leetcoder"));
    }

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
        // 如何定义每次操作最优
    /*游戏状态分析
设整个字符串的元音总数为 V，辅音总数为 C。
情况1：V = 0（没有元音）
小红无法操作（没有包含奇数个元音的子串）
小红输，返回 false

情况2：V 是奇数
小红可以直接移除整个字符串（包含奇数个元音）
或者采取其他策略，但无论如何她都有获胜的选择
小红赢，返回 true

情况3：V 是偶数且 V > 0
这是最复杂的情况，需要仔细分析：
如果存在辅音（C > 0）：
小红移除一个包含奇数个元音的子串，剩下 V' = V - 奇数 = 奇数个元音
小明可以移除一个包含0个元音的子串（辅音），不改变元音奇偶性
现在又轮到小红，面对的还是奇数个元音
这个过程可以继续，直到...
关键问题：小红能否迫使小明陷入无法移除0个元音子串的局面？
如果小红能移除所有辅音，那么小明就只能移除包含偶数个元音的子串
但移除辅音不影响元音总数的奇偶性


最优策略：
小红的目标是：要么直接获胜，要么移除所有辅音

如果所有辅音都被移除，只剩下元音，且元音数是偶数：

小红必须移除奇数个元音，剩下奇数个元音

小明必须移除偶数个元音，但面对奇数个元音，他无法移除偶数个（除非移除0个，但已经没有辅音了）
小明无法操作，小红赢

因此：当 V 是偶数且 V > 0 时：
如果小红能通过一系列操作移除所有辅音，她就赢
否则（如果小明能永远保持有辅音可移除），游戏可能陷入僵局

最优策略下的结果
经过更深入的分析，实际上：
当 V 是偶数且 V > 0 时，小红总是能赢，因为：

小红可以专注于移除包含奇数个元音的子串
即使小明总是移除0个元音的子串（辅音）
最终辅音会被耗尽，或者小红找到直接获胜的方法*/
    public boolean doesAliceWin(String s) {
        Set<Character> set=Set.of('a','e','i','o','u');
        long count = s.chars().mapToObj(c -> (char) c).filter(set::contains).count();
        if(count==0) return false;
        if(count%2==1)return true;
        return true;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
